package Negocio;

import ClassesBasicas.Funcao;
import Repositorio.RepFuncao;
import erro.ConexaoException;
import erro.NegocioException;
import erro.RepositorioException;
import java.util.ArrayList;

/**
 *Classe que define a regra de Negocio para uma Funcao e suas validacoes
 * 
 * @author leyla
 */

public class NegocioFuncao {
    
    	private RepFuncao rep;
	
	public NegocioFuncao(){
		rep = new RepFuncao();
	}
	
	/**
	 * Testa se a Funcao ja foi cadastrada. Caso sim retorna a true, caso contrario, retorna false 
	 * 
	 * @param f
	 * @throws NegocioException
	 * 
	 */
	
	public boolean existeFuncao(Funcao f) throws NegocioException {
		Funcao funcao = new Funcao();
		
			funcao = consultar(f.getNomeFuncao());
			
			if(funcao!= null)
				return true;
			else
				return false;
	}
	
	/**
	 * Validacao dos campos da classe Funcao antes de salvar	
	 * 
	 * @param f
	 * @throws NegocioException
	 * 
	 */
	
	public void salvar(Funcao f) throws NegocioException{
		
		 if(!ValidacoesGerais.isNomeValid(f.getNomeFuncao())){
			 throw new NegocioException("Este campo nao pode conter caracteres numericos nem especiais");
		 }
		
		if(f.getNomeFuncao().equals("") || f.getNomeFuncao().equals(null)){
			throw new NegocioException("Nome invalido!");
		}
		
		if(f.getCodFuncao()<0){
			throw new NegocioException("Codigo invalido!");
		}
		
		try {
			rep.salvar(f);
		} catch (ConexaoException e) {
			throw new NegocioException("Verifique a conexao com o Banco de Dados! "+e.getMessage());
		} 
		catch (RepositorioException e) {
			throw new NegocioException("Erro ao Salvar uma Funcao! "+e.getMessage());
		}
	}
	
	/**
	 * Valida e exclui uma Função pelo codigo 
	 * 
	 * @param codFuncao
	 * @throws NegocioException
	 * 
	 */
	
	public void excluir(int codFuncao) throws NegocioException{
		
		if(codFuncao <= 0){
			throw new NegocioException("Codigo Invalido!");
		}
		try {
			rep.excluir(codFuncao);
		} catch (ConexaoException e) {
			throw new NegocioException("Verifique a conexao com o Banco de Dados! "+e.getMessage());
		} catch (RepositorioException e) {
			throw new NegocioException("Erro ao Excluir uma Funcao! "+e.getMessage());
		}
	}
	
	/**
	 * Valida e exclui uma Funcao pelo nome
	 * 
	 * @param nome
	 * @throws NegocioException
	 * 
	 */
	
	public void excluir(String nome) throws NegocioException{
		
		
		if(!ValidacoesGerais.isNomeValid(nome)){
			throw new NegocioException("Este campo nao pode conter caracteres numericos nem especiais!");
		}
		
		if(nome == null || nome.equals("")){
			throw new NegocioException("Nome invalido!");
		}
		
		try {
			rep.excluir(nome);
		} catch (ConexaoException e) {
			throw new NegocioException("Verifique a conxao com o Banco de Dados! "+e.getMessage());
		} catch (RepositorioException e) {
			throw new NegocioException("Erro ao excluir uma Funcao! "+e.getMessage());
		}
	}
	
	/**
	 * valida e consulta uma Funcao pelo codigo
	 * 
	 * @param codFuncao
	 * @throws NegocioException
	 * 
	 */
	
	public Funcao consultar(int codFuncao) throws NegocioException{
		 Funcao f = null;
		 
		 if(codFuncao <= 0){
			 throw new NegocioException("Codigo Invalido");
		 }
		 
		 try {
			f = rep.consultar(codFuncao);
			
		} catch (ConexaoException e) {
			throw new NegocioException("Verifique a conex�o com o Banco de Dados! "+e.getMessage());
		} catch (RepositorioException e) {
			throw new NegocioException("Erro ao consultar uma Funcao! "+e.getMessage());
		}
		 return f;
	}
	
	/**
	 * valida e consulta uma Funcao pelo nome
	 * 
	 * @param nome
	 * @throws NegocioException
	 * 
	 */
	
	public Funcao consultar(String nome) throws NegocioException{
		 Funcao f = null;
		 
		 if(!ValidacoesGerais.isNomeValid(nome)){
			 throw new NegocioException("Este campo nao pode conter caracteres numericos nem especiais!");
		 }
		 
		 if(nome == null ||nome.equals("")){
			 throw new NegocioException("nome Invalida!");
		 }
		 
		 try {
			f = rep.consultar(nome);	
		} catch (ConexaoException e) {
			throw new NegocioException("Verifique a conexao com o Banco de Dados!"+e.getMessage());
		} catch (RepositorioException e) {			
			throw new NegocioException("Erro ao consultar uma Funcao!."+e.getMessage());
		}			
		 return f;		
	}
	
	/**
	 * Lista todos as Funcoes. Caso nao haja, retorna uma lista vazia!
	 * 
	 * @return ArrayList<Funcao>
	 * @throws NegocioException
	 * 
	 */
	
	public ArrayList<Funcao> listarFuncao() throws NegocioException{
		
		ArrayList<Funcao> lista = null;
		
		try {
			lista = (ArrayList<Funcao>) rep.listar();
		} catch (ConexaoException e) {
			throw new NegocioException("Verifique a conexao com o Banco de Dados!"+e.getMessage());
		} catch (RepositorioException e) {
			throw new NegocioException("Erro ao listar as Funções!" +e.getMessage());
		}
		return lista;
	}
}